home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Python 1.1 / Modules / socketmodule.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-10  |  28.0 KB  |  1,126 lines  |  [TEXT/KAHL]

  1. /***********************************************************
  2. Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
  3. Amsterdam, The Netherlands.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its 
  8. documentation for any purpose and without fee is hereby granted, 
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in 
  11. supporting documentation, and that the names of Stichting Mathematisch
  12. Centrum or CWI not be used in advertising or publicity pertaining to
  13. distribution of the software without specific, written prior permission.
  14.  
  15. STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  16. THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17. FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  18. FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19. WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  20. ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  21. OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  
  23. ******************************************************************/
  24.  
  25. /* Socket module */
  26.  
  27. /*
  28. This module provides an interface to Berkeley socket IPC.
  29.  
  30. Limitations:
  31.  
  32. - only AF_INET and AF_UNIX address families are supported
  33. - no asynchronous I/O (but you can use select() on sockets)
  34. - no read/write operations (use send/recv or makefile instead)
  35. - setsockopt() and getsockopt() only support integer options
  36.  
  37. Interface:
  38.  
  39. - socket.gethostname() --> host name (string)
  40. - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
  41. - socket.getservbyname(servername, protocolname) --> port number
  42. - socket.socket(family, type [, proto]) --> new socket object
  43. - family and type constants from <socket.h> are accessed as socket.AF_INET etc.
  44. - errors are reported as the exception socket.error
  45. - an Internet socket address is a pair (hostname, port)
  46.   where hostname can be anything recognized by gethostbyname()
  47.   (including the dd.dd.dd.dd notation) and port is in host byte order
  48. - where a hostname is returned, the dd.dd.dd.dd notation is used
  49. - a UNIX domain socket is a string specifying the pathname
  50.  
  51. Socket methods:
  52.  
  53. - s.accept() --> new socket object, sockaddr
  54. - s.setsockopt(level, optname, flag) --> Py_None
  55. - s.getsockopt(level, optname) --> flag
  56. - s.bind(sockaddr) --> Py_None
  57. - s.connect(sockaddr) --> Py_None
  58. - s.getsockname() --> sockaddr
  59. - s.getpeername() --> sockaddr
  60. - s.listen(n) --> Py_None
  61. - s.makefile(mode) --> file object
  62. - s.recv(nbytes [,flags]) --> string
  63. - s.recvfrom(nbytes [,flags]) --> string, sockaddr
  64. - s.send(string [,flags]) --> nbytes
  65. - s.sendto(string, [flags,] sockaddr) --> nbytes
  66. - s.setblocking(1 | 0) --> Py_None
  67. - s.shutdown(how) --> Py_None
  68. - s.close() --> Py_None
  69.  
  70. */
  71.  
  72. #include "Python.h"
  73.  
  74. #include <sys/types.h>
  75. #include "mytime.h"
  76.  
  77. #include <signal.h>
  78. #ifndef NT
  79. #include <netdb.h>
  80. #include <sys/socket.h>
  81. #include <netinet/in.h>
  82. #include <fcntl.h>
  83. #else
  84. #include <winsock.h>
  85. #endif
  86. #ifdef HAVE_SYS_UN_H
  87. #include <sys/un.h>
  88. #else
  89. #undef AF_UNIX
  90. #endif
  91.  
  92. /* Here we have some hacks to choose between K&R or ANSI style function
  93.    definitions.  For NT to build this as an extension module (ie, DLL)
  94.    it must be compiled by the C++ compiler, as it takes the address of
  95.    a static data item exported from the main Python DLL.
  96. */
  97. #ifdef NT
  98. /* seem to be a few differences in the API */
  99. #define close closesocket
  100. #define NO_DUP    /* I wont trust passing a socket to NT's RTL!!  */
  101. #define FORCE_ANSI_FUNC_DEFS
  102. #endif
  103.  
  104. #ifdef FORCE_ANSI_FUNC_DEFS
  105. #define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name )    \
  106. fnname( arg1type arg1name )
  107.  
  108. #define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
  109. fnname( arg1type arg1name, arg2type arg2name )
  110.  
  111. #define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name )    \
  112. fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
  113.  
  114. #define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name )    \
  115. fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
  116.  
  117. #else /* !FORCE_ANSI_FN_DEFS */
  118. #define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name )    \
  119. fnname( arg1name )    \
  120.     arg1type arg1name;
  121.  
  122. #define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
  123. fnname( arg1name, arg2name )    \
  124.     arg1type arg1name;    \
  125.     arg2type arg2name;
  126.  
  127. #define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
  128. fnname( arg1name, arg2name, arg3name )    \
  129.     arg1type arg1name;    \
  130.     arg2type arg2name;    \
  131.     arg3type arg3name;
  132.  
  133. #define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
  134. fnname( arg1name, arg2name, arg3name, arg4name )    \
  135.     arg1type arg1name;    \
  136.     arg2type arg2name;    \
  137.     arg3type arg3name;    \
  138.     arg4type arg4name;
  139.  
  140. #endif /* !FORCE_ANSI_FN_DEFS */
  141.  
  142. /* Global variable holding the exception type for errors detected
  143.    by this module (but not argument type or memory errors, etc.). */
  144.  
  145. static PyObject *PySocket_Error;
  146.  
  147.  
  148. /* Convenience function to raise an error according to errno
  149.    and return a NULL pointer from a function. */
  150.  
  151. static PyObject *
  152. PySocket_Err()
  153. {
  154. #ifdef NT
  155.     if (WSAGetLastError()) {
  156.         PyObject *v;
  157.         v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
  158.         if (v != NULL) {
  159.             PyErr_SetObject(PySocket_Error, v);
  160.             Py_DECREF(v);
  161.         }
  162.         return NULL;
  163.     }
  164.     else
  165. #endif
  166.     return PyErr_SetFromErrno(PySocket_Error);
  167. }
  168.  
  169.  
  170. /* The object holding a socket.  It holds some extra information,
  171.    like the address family, which is used to decode socket address
  172.    arguments properly. */
  173.  
  174. typedef struct {
  175.     PyObject_HEAD
  176.     int sock_fd;        /* Socket file descriptor */
  177.     int sock_family;    /* Address family, e.g., AF_INET */
  178.     int sock_type;        /* Socket type, e.g., SOCK_STREAM */
  179.     int sock_proto;        /* Protocol type, usually 0 */
  180. } PySocketSockObject;
  181.  
  182.  
  183. /* A forward reference to the Socktype type object.
  184.    The Socktype variable contains pointers to various functions,
  185.    some of which call newsockobject(), which uses Socktype, so
  186.    there has to be a circular reference. */
  187.  
  188. staticforward PyTypeObject PySocketSock_Type;
  189.  
  190.  
  191. /* Create a new socket object.
  192.    This just creates the object and initializes it.
  193.    If the creation fails, return NULL and set an exception (implicit
  194.    in NEWOBJ()). */
  195.  
  196. static PySocketSockObject *
  197. BUILD_FUNC_DEF_4(PySocketSock_New, int, fd, int, family, int, type, int, proto)
  198. {
  199.     PySocketSockObject *s;
  200.     s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
  201.     if (s != NULL) {
  202.         s->sock_fd = fd;
  203.         s->sock_family = family;
  204.         s->sock_type = type;
  205.         s->sock_proto = proto;
  206.     }
  207.     return s;
  208. }
  209.  
  210.  
  211. /* Convert a string specifying a host name or one of a few symbolic
  212.    names to a numeric IP address.  This usually calls gethostbyname()
  213.    to do the work; the names "" and "<broadcast>" are special.
  214.    Return the length (should always be 4 bytes), or negative if
  215.    an error occurred; then an exception is raised. */
  216.  
  217. static int
  218. BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
  219. {
  220.     struct hostent *hp;
  221.     int d1, d2, d3, d4;
  222.     char ch;
  223.  
  224.     if (name[0] == '\0') {
  225.         addr_ret->sin_addr.s_addr = INADDR_ANY;
  226.         return 4;
  227.     }
  228.     if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
  229.         addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
  230.         return 4;
  231.     }
  232.     if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
  233.         0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
  234.         0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
  235.         addr_ret->sin_addr.s_addr = htonl(
  236.             ((long) d1 << 24) | ((long) d2 << 16) |
  237.             ((long) d3 << 8) | ((long) d4 << 0));
  238.         return 4;
  239.     }
  240.     Py_BEGIN_ALLOW_THREADS
  241.     hp = gethostbyname(name);
  242.     Py_END_ALLOW_THREADS
  243.     if (hp == NULL) {
  244.         PyErr_SetString(PySocket_Error, "host not found");
  245.         return -1;
  246.     }
  247.     memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
  248.     return hp->h_length;
  249. }
  250.  
  251.  
  252. /* Create a string object representing an IP address.
  253.    This is always a string of the form 'dd.dd.dd.dd' (with variable
  254.    size numbers). */
  255.  
  256. static PyObject *
  257. BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
  258. {
  259.     long x = ntohl(addr->sin_addr.s_addr);
  260.     char buf[100];
  261.     sprintf(buf, "%d.%d.%d.%d",
  262.         (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
  263.         (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
  264.     return PyString_FromString(buf);
  265. }
  266.  
  267.  
  268. /* Create an object representing the given socket address,
  269.    suitable for passing it back to bind(), connect() etc.
  270.    The family field of the sockaddr structure is inspected
  271.    to determine what kind of address it really is. */
  272.  
  273. /*ARGSUSED*/
  274. static PyObject *
  275. BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
  276. {
  277.     if (addrlen == 0) {
  278.         /* No address -- may be recvfrom() from known socket */
  279.         Py_INCREF(Py_None);
  280.         return Py_None;
  281.     }
  282.  
  283.     switch (addr->sa_family) {
  284.  
  285.     case AF_INET:
  286.     {
  287.         struct sockaddr_in *a = (struct sockaddr_in *) addr;
  288.         PyObject *addr = makeipaddr(a);
  289.         PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
  290.         Py_XDECREF(addr);
  291.         return ret;
  292.     }
  293.  
  294. #ifdef AF_UNIX
  295.     case AF_UNIX:
  296.     {
  297.         struct sockaddr_un *a = (struct sockaddr_un *) addr;
  298.         return PyString_FromString(a->sun_path);
  299.     }
  300. #endif /* AF_UNIX */
  301.  
  302.     /* More cases here... */
  303.  
  304.     default:
  305.         PyErr_SetString(PySocket_Error, "return unknown socket address type");
  306.         return NULL;
  307.  
  308.     }
  309. }
  310.  
  311.  
  312. /* Parse a socket address argument according to the socket object's
  313.    address family.  Return 1 if the address was in the proper format,
  314.    0 of not.  The address is returned through addr_ret, its length
  315.    through len_ret. */
  316.  
  317. static int
  318. BUILD_FUNC_DEF_4(
  319. getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
  320. {
  321.     switch (s->sock_family) {
  322.  
  323. #ifdef AF_UNIX
  324.     case AF_UNIX:
  325.     {
  326.         static struct sockaddr_un addr;
  327.         char *path;
  328.         int len;
  329.         if (!PyArg_Parse(args, "s#", &path, &len))
  330.             return 0;
  331.         if (len > sizeof addr.sun_path) {
  332.             PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
  333.             return 0;
  334.         }
  335.         addr.sun_family = AF_UNIX;
  336.         memcpy(addr.sun_path, path, len);
  337.         *addr_ret = (struct sockaddr *) &addr;
  338.         *len_ret = len + sizeof addr.sun_family;
  339.         return 1;
  340.     }
  341. #endif /* AF_UNIX */
  342.  
  343.     case AF_INET:
  344.     {
  345.         static struct sockaddr_in addr;
  346.         char *host;
  347.         int port;
  348.         if (!PyArg_Parse(args, "(si)", &host, &port))
  349.             return 0;
  350.         if (setipaddr(host, &addr) < 0)
  351.             return 0;
  352.         addr.sin_family = AF_INET;
  353.         addr.sin_port = htons(port);
  354.         *addr_ret = (struct sockaddr *) &addr;
  355.         *len_ret = sizeof addr;
  356.         return 1;
  357.     }
  358.  
  359.     /* More cases here... */
  360.  
  361.     default:
  362.         PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
  363.         return 0;
  364.  
  365.     }
  366. }
  367.  
  368.  
  369. /* Get the address length according to the socket object's address family. 
  370.    Return 1 if the family is known, 0 otherwise.  The length is returned
  371.    through len_ret. */
  372.  
  373. static int
  374. BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
  375. {
  376.     switch (s->sock_family) {
  377.  
  378. #ifdef AF_UNIX
  379.     case AF_UNIX:
  380.     {
  381.         *len_ret = sizeof (struct sockaddr_un);
  382.         return 1;
  383.     }
  384. #endif /* AF_UNIX */
  385.  
  386.     case AF_INET:
  387.     {
  388.         *len_ret = sizeof (struct sockaddr_in);
  389.         return 1;
  390.     }
  391.  
  392.     /* More cases here... */
  393.  
  394.     default:
  395.         PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
  396.         return 0;
  397.  
  398.     }
  399. }
  400.  
  401.  
  402. /* s.accept() method */
  403.  
  404. static PyObject *
  405. BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
  406. {
  407.     char addrbuf[256];
  408.     int addrlen, newfd;
  409.     PyObject *sock, *addr, *res;
  410.     if (!PyArg_NoArgs(args))
  411.         return NULL;
  412.     if (!getsockaddrlen(s, &addrlen))
  413.         return NULL;
  414.     Py_BEGIN_ALLOW_THREADS
  415.     newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
  416.     Py_END_ALLOW_THREADS
  417.     if (newfd < 0)
  418.         return PySocket_Err();
  419.     /* Create the new object with unspecified family,
  420.        to avoid calls to bind() etc. on it. */
  421.     sock = (PyObject *) PySocketSock_New(newfd,
  422.                     s->sock_family,
  423.                     s->sock_type,
  424.                     s->sock_proto);
  425.     if (sock == NULL)
  426.         close(newfd);
  427.     addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
  428.     res = Py_BuildValue("OO", sock, addr);
  429.     Py_XDECREF(sock);
  430.     Py_XDECREF(addr);
  431.     return res;
  432. }
  433.  
  434.  
  435. #if 0
  436. /* s.allowbroadcast() method */
  437. /* XXX obsolete -- will disappear in next release */
  438.  
  439. static PyObject *
  440. BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
  441. {
  442.     int flag;
  443.     int res;
  444.     if (!PyArg_Parse(args, "i", &flag))
  445.         return NULL;
  446.     res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
  447.              (ANY *)&flag, sizeof flag);
  448.     if (res < 0)
  449.         return PySocket_Err();
  450.     Py_INCREF(Py_None);
  451.     return Py_None;
  452. }
  453. #endif
  454.  
  455.  
  456. #ifndef NT
  457.  
  458. /* s.setblocking(1 | 0) method */
  459.  
  460. static PyObject *
  461. PySocketSock_setblocking(s, args)
  462.     PySocketSockObject *s;
  463.     PyObject *args;
  464. {
  465.     int block;
  466.     int delay_flag;
  467.     if (!PyArg_GetInt(args, &block))
  468.         return NULL;
  469.     Py_BEGIN_ALLOW_THREADS
  470.     delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
  471.     if (block)
  472.         delay_flag &= (~O_NDELAY);
  473.     else
  474.         delay_flag |= O_NDELAY;
  475.     fcntl (s->sock_fd, F_SETFL, delay_flag);
  476.     Py_END_ALLOW_THREADS
  477.  
  478.     Py_INCREF(Py_None);
  479.     return Py_None;
  480. }
  481. #endif
  482.  
  483.  
  484. /* s.setsockopt() method.
  485.    With an integer third argument, sets an integer option.
  486.    With a string third argument, sets an option from a buffer;
  487.    use optional built-in module 'struct' to encode the string. */
  488.  
  489. static PyObject *
  490. BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
  491. {
  492.     int level;
  493.     int optname;
  494.     int res;
  495.     char *buf;
  496.     int buflen;
  497.     int flag;
  498.  
  499.     if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
  500.         buf = (char *) &flag;
  501.         buflen = sizeof flag;
  502.     }
  503.     else {
  504.         PyErr_Clear();
  505.         if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
  506.             return NULL;
  507.     }
  508.     res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
  509.     if (res < 0)
  510.         return PySocket_Err();
  511.     Py_INCREF(Py_None);
  512.     return Py_None;
  513. }
  514.  
  515.  
  516. /* s.getsockopt() method.
  517.    With two arguments, retrieves an integer option.
  518.    With a third integer argument, retrieves a string buffer of that size;
  519.    use optional built-in module 'struct' to decode the string. */
  520.  
  521. static PyObject *
  522. BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
  523. {
  524.     int level;
  525.     int optname;
  526.     int res;
  527.     PyObject *buf;
  528.     int buflen;
  529.     int flag;
  530.  
  531.     if (PyArg_Parse(args, "(ii)", &level, &optname)) {
  532.         int flag = 0;
  533.         int flagsize = sizeof flag;
  534.         res = getsockopt(s->sock_fd, level, optname,
  535.                  (ANY *)&flag, &flagsize);
  536.         if (res < 0)
  537.             return PySocket_Err();
  538.         return PyInt_FromLong(flag);
  539.     }
  540.     PyErr_Clear();
  541.     if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
  542.         return NULL;
  543.     if (buflen <= 0 || buflen > 1024) {
  544.         PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
  545.         return NULL;
  546.     }
  547.     buf = PyString_FromStringAndSize((char *)NULL, buflen);
  548.     if (buf == NULL)
  549.         return NULL;
  550.     res = getsockopt(s->sock_fd, level, optname,
  551.              (ANY *)getstringvalue(buf), &buflen);
  552.     if (res < 0) {
  553.         Py_DECREF(buf);
  554.         return PySocket_Err();
  555.     }
  556.     _PyString_Resize(&buf, buflen);
  557.     return buf;
  558. }
  559.  
  560.  
  561. /* s.bind(sockaddr) method */
  562.  
  563. static PyObject *
  564. BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
  565. {
  566.     struct sockaddr *addr;
  567.     int addrlen;
  568.     int res;
  569.     if (!getsockaddrarg(s, args, &addr, &addrlen))
  570.         return NULL;
  571.     Py_BEGIN_ALLOW_THREADS
  572.     res = bind(s->sock_fd, addr, addrlen);
  573.     Py_END_ALLOW_THREADS
  574.     if (res < 0)
  575.         return PySocket_Err();
  576.     Py_INCREF(Py_None);
  577.     return Py_None;
  578. }
  579.  
  580.  
  581. /* s.close() method.
  582.    Set the file descriptor to -1 so operations tried subsequently
  583.    will surely fail. */
  584.  
  585. static PyObject *
  586. BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
  587. {
  588.     if (!PyArg_NoArgs(args))
  589.         return NULL;
  590.     Py_BEGIN_ALLOW_THREADS
  591.     (void) close(s->sock_fd);
  592.     Py_END_ALLOW_THREADS
  593.     s->sock_fd = -1;
  594.     Py_INCREF(Py_None);
  595.     return Py_None;
  596. }
  597.  
  598.  
  599. /* s.connect(sockaddr) method */
  600.  
  601. static PyObject *
  602. BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
  603. {
  604.     struct sockaddr *addr;
  605.     int addrlen;
  606.     int res;
  607.     if (!getsockaddrarg(s, args, &addr, &addrlen))
  608.         return NULL;
  609.     Py_BEGIN_ALLOW_THREADS
  610.     res = connect(s->sock_fd, addr, addrlen);
  611.     Py_END_ALLOW_THREADS
  612.     if (res < 0)
  613.         return PySocket_Err();
  614.     Py_INCREF(Py_None);
  615.     return Py_None;
  616. }
  617.  
  618.  
  619. /* s.fileno() method */
  620.  
  621. static PyObject *
  622. BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
  623. {
  624.     if (!PyArg_NoArgs(args))
  625.         return NULL;
  626.     return PyInt_FromLong((long) s->sock_fd);
  627. }
  628.  
  629.  
  630. /* s.getsockname() method */
  631.  
  632. static PyObject *
  633. BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
  634. {
  635.     char addrbuf[256];
  636.     int addrlen, res;
  637.     if (!PyArg_NoArgs(args))
  638.         return NULL;
  639.     if (!getsockaddrlen(s, &addrlen))
  640.         return NULL;
  641.     Py_BEGIN_ALLOW_THREADS
  642.     res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
  643.     Py_END_ALLOW_THREADS
  644.     if (res < 0)
  645.         return PySocket_Err();
  646.     return makesockaddr((struct sockaddr *) addrbuf, addrlen);
  647. }
  648.  
  649.  
  650. #ifdef HAVE_GETPEERNAME        /* Cray APP doesn't have this :-( */
  651. /* s.getpeername() method */
  652.  
  653. static PyObject *
  654. BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
  655. {
  656.     char addrbuf[256];
  657.     int addrlen, res;
  658.     if (!PyArg_NoArgs(args))
  659.         return NULL;
  660.     if (!getsockaddrlen(s, &addrlen))
  661.         return NULL;
  662.     Py_BEGIN_ALLOW_THREADS
  663.     res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
  664.     Py_END_ALLOW_THREADS
  665.     if (res < 0)
  666.         return PySocket_Err();
  667.     return makesockaddr((struct sockaddr *) addrbuf, addrlen);
  668. }
  669. #endif /* HAVE_GETPEERNAME */
  670.  
  671.  
  672. /* s.listen(n) method */
  673.  
  674. static PyObject *
  675. BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
  676. {
  677.     int backlog;
  678.     int res;
  679.     if (!PyArg_GetInt(args, &backlog))
  680.         return NULL;
  681.     Py_BEGIN_ALLOW_THREADS
  682.     if (backlog < 1)
  683.         backlog = 1;
  684.     res = listen(s->sock_fd, backlog);
  685.     Py_END_ALLOW_THREADS
  686.     if (res < 0)
  687.         return PySocket_Err();
  688.     Py_INCREF(Py_None);
  689.     return Py_None;
  690. }
  691.  
  692. #ifndef NO_DUP
  693. /* s.makefile(mode) method.
  694.    Create a new open file object referring to a dupped version of
  695.    the socket's file descriptor.  (The dup() call is necessary so
  696.    that the open file and socket objects may be closed independent
  697.    of each other.)
  698.    The mode argument specifies 'r' or 'w' passed to fdopen(). */
  699.  
  700. static PyObject *
  701. BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
  702. {
  703.     extern int fclose PROTO((FILE *));
  704.     char *mode;
  705.     int fd;
  706.     FILE *fp;
  707.     if (!PyArg_Parse(args, "s", &mode))
  708.         return NULL;
  709.     if ((fd = dup(s->sock_fd)) < 0 ||
  710.         (fp = fdopen(fd, mode)) == NULL)
  711.         return PySocket_Err();
  712.     return PyFile_FromFile(fp, "<socket>", mode, fclose);
  713. }
  714. #endif /* NO_DUP */
  715.  
  716. /* s.recv(nbytes [,flags]) method */
  717.  
  718. static PyObject *
  719. BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
  720. {
  721.     int len, n, flags;
  722.     PyObject *buf;
  723.     flags = 0;
  724.     if (!PyArg_Parse(args, "i", &len)) {
  725.         PyErr_Clear();
  726.         if (!PyArg_Parse(args, "(ii)", &len, &flags))
  727.             return NULL;
  728.     }
  729.     buf = PyString_FromStringAndSize((char *) 0, len);
  730.     if (buf == NULL)
  731.         return NULL;
  732.     Py_BEGIN_ALLOW_THREADS
  733.     n = recv(s->sock_fd, getstringvalue(buf), len, flags);
  734.     Py_END_ALLOW_THREADS
  735.     if (n < 0)
  736.         return PySocket_Err();
  737.     if (_PyString_Resize(&buf, n) < 0)
  738.         return NULL;
  739.     return buf;
  740. }
  741.  
  742.  
  743. /* s.recvfrom(nbytes [,flags]) method */
  744.  
  745. static PyObject *
  746. BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
  747. {
  748.     char addrbuf[256];
  749.     PyObject *buf, *addr, *ret;
  750.     int addrlen, len, n, flags;
  751.     flags = 0;
  752.     if (!PyArg_Parse(args, "i", &len)) {
  753.         PyErr_Clear();
  754.         if (!PyArg_Parse(args, "(ii)", &len, &flags))
  755.             return NULL;
  756.     }
  757.     if (!getsockaddrlen(s, &addrlen))
  758.         return NULL;
  759.     buf = PyString_FromStringAndSize((char *) 0, len);
  760.     if (buf == NULL)
  761.         return NULL;
  762.     Py_BEGIN_ALLOW_THREADS
  763.     n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
  764. #ifndef NT
  765.              (ANY *)addrbuf, &addrlen);
  766. #else
  767.                   (struct sockaddr *)addrbuf, &addrlen);
  768. #endif
  769.     Py_END_ALLOW_THREADS
  770.     if (n < 0)
  771.         return PySocket_Err();
  772.     if (_PyString_Resize(&buf, n) < 0)
  773.         return NULL;
  774.     addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
  775.     ret = Py_BuildValue("OO", buf, addr);
  776.     Py_XDECREF(addr);
  777.     Py_XDECREF(buf);
  778.     return ret;
  779. }
  780.  
  781.  
  782. /* s.send(data [,flags]) method */
  783.  
  784. static PyObject *
  785. BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
  786. {
  787.     char *buf;
  788.     int len, n, flags;
  789.     flags = 0;
  790.     if (!PyArg_Parse(args, "s#", &buf, &len)) {
  791.         PyErr_Clear();
  792.         if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
  793.             return NULL;
  794.     }
  795.     Py_BEGIN_ALLOW_THREADS
  796.     n = send(s->sock_fd, buf, len, flags);
  797.     Py_END_ALLOW_THREADS
  798.     if (n < 0)
  799.         return PySocket_Err();
  800.     return PyInt_FromLong((long)n);
  801. }
  802.  
  803.  
  804. /* s.sendto(data, [flags,] sockaddr) method */
  805.  
  806. static PyObject *
  807. BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
  808. {
  809.     PyObject *addro;
  810.     char *buf;
  811.     struct sockaddr *addr;
  812.     int addrlen, len, n, flags;
  813.     flags = 0;
  814.     if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
  815.         PyErr_Clear();
  816.         if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
  817.             return NULL;
  818.     }
  819.     if (!getsockaddrarg(s, addro, &addr, &addrlen))
  820.         return NULL;
  821.     Py_BEGIN_ALLOW_THREADS
  822.     n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
  823.     Py_END_ALLOW_THREADS
  824.     if (n < 0)
  825.         return PySocket_Err();
  826.     return PyInt_FromLong((long)n);
  827. }
  828.  
  829.  
  830. /* s.shutdown(how) method */
  831.  
  832. static PyObject *
  833. BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
  834. {
  835.     int how;
  836.     int res;
  837.     if (!PyArg_GetInt(args, &how))
  838.         return NULL;
  839.     Py_BEGIN_ALLOW_THREADS
  840.     res = shutdown(s->sock_fd, how);
  841.     Py_END_ALLOW_THREADS
  842.     if (res < 0)
  843.         return PySocket_Err();
  844.     Py_INCREF(Py_None);
  845.     return Py_None;
  846. }
  847.  
  848.  
  849. /* List of methods for socket objects */
  850.  
  851. static PyMethodDef PySocketSock_methods[] = {
  852.     {"accept",        (PyCFunction)PySocketSock_accept},
  853. #if 0
  854.     {"allowbroadcast",    (PyCFunction)PySocketSock_allowbroadcast},
  855. #endif
  856. #ifndef NT
  857.     {"setblocking",         (PyCFunction)PySocketSock_setblocking},
  858. #endif
  859.     {"setsockopt",        (PyCFunction)PySocketSock_setsockopt},
  860.     {"getsockopt",        (PyCFunction)PySocketSock_getsockopt},
  861.     {"bind",        (PyCFunction)PySocketSock_bind},
  862.     {"close",        (PyCFunction)PySocketSock_close},
  863.     {"connect",        (PyCFunction)PySocketSock_connect},
  864.     {"fileno",        (PyCFunction)PySocketSock_fileno},
  865.     {"getsockname",        (PyCFunction)PySocketSock_getsockname},
  866. #ifdef HAVE_GETPEERNAME
  867.     {"getpeername",        (PyCFunction)PySocketSock_getpeername},
  868. #endif
  869.     {"listen",        (PyCFunction)PySocketSock_listen},
  870. #ifndef NO_DUP
  871.     {"makefile",        (PyCFunction)PySocketSock_makefile},
  872. #endif
  873.     {"recv",        (PyCFunction)PySocketSock_recv},
  874.     {"recvfrom",        (PyCFunction)PySocketSock_recvfrom},
  875.     {"send",        (PyCFunction)PySocketSock_send},
  876.     {"sendto",        (PyCFunction)PySocketSock_sendto},
  877.     {"shutdown",        (PyCFunction)PySocketSock_shutdown},
  878.     {NULL,            NULL}        /* sentinel */
  879. };
  880.  
  881.  
  882. /* Deallocate a socket object in response to the last Py_DECREF().
  883.    First close the file description. */
  884.  
  885. static void
  886. BUILD_FUNC_DEF_1(PySocketSock_dealloc, PySocketSockObject *,s)
  887. {
  888.     (void) close(s->sock_fd);
  889.     PyMem_DEL(s);
  890. }
  891.  
  892.  
  893. /* Return a socket object's named attribute. */
  894.  
  895. static PyObject *
  896. BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
  897. {
  898.     return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
  899. }
  900.  
  901.  
  902. /* Type object for socket objects. */
  903.  
  904. static PyTypeObject PySocketSock_Type = {
  905.     PyObject_HEAD_INIT(&PyType_Type)
  906.     0,
  907.     "socket",
  908.     sizeof(PySocketSockObject),
  909.     0,
  910.     (destructor)PySocketSock_dealloc, /*tp_dealloc*/
  911.     0,        /*tp_print*/
  912.     (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
  913.     0,        /*tp_setattr*/
  914.     0,        /*tp_compare*/
  915.     0,        /*tp_repr*/
  916.     0,        /*tp_as_number*/
  917.     0,        /*tp_as_sequence*/
  918.     0,        /*tp_as_mapping*/
  919. };
  920.  
  921.  
  922. /* Python interface to gethostname(). */
  923.  
  924. /*ARGSUSED*/
  925. static PyObject *
  926. BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
  927. {
  928.     char buf[1024];
  929.     int res;
  930.     if (!PyArg_NoArgs(args))
  931.         return NULL;
  932.     Py_BEGIN_ALLOW_THREADS
  933.     res = gethostname(buf, (int) sizeof buf - 1);
  934.     Py_END_ALLOW_THREADS
  935.     if (res < 0)
  936.         return PySocket_Err();
  937.     buf[sizeof buf - 1] = '\0';
  938.     return PyString_FromString(buf);
  939. }
  940.  
  941.  
  942. /* Python interface to gethostbyname(name). */
  943.  
  944. /*ARGSUSED*/
  945. static PyObject *
  946. BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
  947. {
  948.     char *name;
  949.     struct sockaddr_in addrbuf;
  950.     if (!PyArg_Parse(args, "s", &name))
  951.         return NULL;
  952.     if (setipaddr(name, &addrbuf) < 0)
  953.         return NULL;
  954.     return makeipaddr(&addrbuf);
  955. }
  956.  
  957.  
  958. /* Python interface to getservbyname(name).
  959.    This only returns the port number, since the other info is already
  960.    known or not useful (like the list of aliases). */
  961.  
  962. /*ARGSUSED*/
  963. static PyObject *
  964. BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
  965. {
  966.     char *name, *proto;
  967.     struct servent *sp;
  968.     if (!PyArg_Parse(args, "(ss)", &name, &proto))
  969.         return NULL;
  970.     Py_BEGIN_ALLOW_THREADS
  971.     sp = getservbyname(name, proto);
  972.     Py_END_ALLOW_THREADS
  973.     if (sp == NULL) {
  974.         PyErr_SetString(PySocket_Error, "service/proto not found");
  975.         return NULL;
  976.     }
  977.     return PyInt_FromLong((long) ntohs(sp->s_port));
  978. }
  979.  
  980.  
  981. /* Python interface to socket(family, type, proto).
  982.    The third (protocol) argument is optional.
  983.    Return a new socket object. */
  984.  
  985. /*ARGSUSED*/
  986. static PyObject *
  987. BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self,PyObject *,args)
  988. {
  989.     PySocketSockObject *s;
  990.     int fd, family, type, proto;
  991.     proto = 0;
  992.     if (!PyArg_Parse(args, "(ii)", &family, &type)) {
  993.         PyErr_Clear();
  994.         if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
  995.             return NULL;
  996.     }
  997.     Py_BEGIN_ALLOW_THREADS
  998.     fd = socket(family, type, proto);
  999.     Py_END_ALLOW_THREADS
  1000.     if (fd < 0)
  1001.         return PySocket_Err();
  1002.     s = PySocketSock_New(fd, family, type, proto);
  1003.     /* If the object can't be created, don't forget to close the
  1004.        file descriptor again! */
  1005.     if (s == NULL)
  1006.         (void) close(fd);
  1007.     /* From now on, ignore SIGPIPE and let the error checking
  1008.        do the work. */
  1009. #ifdef SIGPIPE      
  1010.     (void) signal(SIGPIPE, SIG_IGN);
  1011. #endif   
  1012.     return (PyObject *) s;
  1013. }
  1014.  
  1015. #ifndef NO_DUP
  1016. /* Create a socket object from a numeric file description.
  1017.    Useful e.g. if stdin is a socket.
  1018.    Additional arguments as for socket(). */
  1019.  
  1020. /*ARGSUSED*/
  1021. static PyObject *
  1022. BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self,PyObject *,args)
  1023. {
  1024.     PySocketSockObject *s;
  1025.     int fd, family, type, proto;
  1026.     proto = 0;
  1027.     if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
  1028.         PyErr_Clear();
  1029.         if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
  1030.             return NULL;
  1031.     }
  1032.     /* Dup the fd so it and the socket can be closed independently */
  1033.     fd = dup(fd);
  1034.     if (fd < 0)
  1035.         return PySocket_Err();
  1036.     s = PySocketSock_New(fd, family, type, proto);
  1037.     /* From now on, ignore SIGPIPE and let the error checking
  1038.        do the work. */
  1039. #ifdef SIGPIPE      
  1040.     (void) signal(SIGPIPE, SIG_IGN);
  1041. #endif   
  1042.     return (PyObject *) s;
  1043. }
  1044. #endif /* NO_DUP */
  1045.  
  1046. /* List of functions exported by this module. */
  1047.  
  1048. static PyMethodDef PySocket_methods[] = {
  1049.     {"gethostbyname",    PySocket_gethostbyname},
  1050.     {"gethostname",        PySocket_gethostname},
  1051.     {"getservbyname",    PySocket_getservbyname},
  1052.     {"socket",        PySocket_socket},
  1053. #ifndef NO_DUP
  1054.     {"fromfd",        PySocket_fromfd},
  1055. #endif
  1056.     {NULL,            NULL}         /* Sentinel */
  1057. };
  1058.  
  1059.  
  1060. /* Convenience routine to export an integer value.
  1061.    For simplicity, errors (which are unlikely anyway) are ignored. */
  1062.  
  1063. static void
  1064. BUILD_FUNC_DEF_3(insint,PyObject *,d,char *,name,int,value)
  1065. {
  1066.     PyObject *v = PyInt_FromLong((long) value);
  1067.     if (v == NULL) {
  1068.         /* Don't bother reporting this error */
  1069.         PyErr_Clear();
  1070.     }
  1071.     else {
  1072.         PyDict_SetItemString(d, name, v);
  1073.         Py_DECREF(v);
  1074.     }
  1075. }
  1076.  
  1077.  
  1078. /* Initialize this module.
  1079.    This is called when the first 'import socket' is done,
  1080.    via a table in config.c, if config.c is compiled with USE_SOCKET
  1081.    defined. */
  1082.  
  1083. void
  1084. initsocket()
  1085. {
  1086.     PyObject *m, *d;
  1087.     m = Py_InitModule("socket", PySocket_methods);
  1088.     d = PyModule_GetDict(m);
  1089.     PySocket_Error = PyString_FromString("socket.error");
  1090.     if (PySocket_Error == NULL || 
  1091.         PyDict_SetItemString(d, "error", PySocket_Error) != 0)
  1092.         Py_FatalError("can't define socket.error");
  1093.     insint(d, "AF_INET", AF_INET);
  1094. #ifdef AF_UNIX
  1095.     insint(d, "AF_UNIX", AF_UNIX);
  1096. #endif /* AF_UNIX */
  1097.     insint(d, "SOCK_STREAM", SOCK_STREAM);
  1098.     insint(d, "SOCK_DGRAM", SOCK_DGRAM);
  1099.     insint(d, "SOCK_RAW", SOCK_RAW);
  1100.     insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
  1101.     insint(d, "SOCK_RDM", SOCK_RDM);
  1102. }
  1103.  
  1104. #ifdef NT
  1105. BOOL    WINAPI    DllMain (HANDLE hInst, 
  1106.             ULONG ul_reason_for_call,
  1107.             LPVOID lpReserved)
  1108. {
  1109.     switch (ul_reason_for_call)
  1110.     {
  1111.         case DLL_PROCESS_ATTACH:
  1112.             WSADATA WSAData;
  1113.             if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
  1114.                 OutputDebugString("Python can't initialize Windows Sockets DLL!");
  1115.                 return FALSE;
  1116.             }
  1117.             break;
  1118.         case DLL_PROCESS_DETACH:
  1119.             WSACleanup();
  1120.             break;
  1121.  
  1122.     }
  1123.     return TRUE;
  1124. }
  1125. #endif /* NT */
  1126.